home *** CD-ROM | disk | FTP | other *** search
- ;***********************************************
- CODESEG SEGMENT BYTE PUBLIC 'CODE'
- ASSUME CS:CODESEG,DS:CODESEG,ES:CODESEG
- ;
- ;----------------------------------------------
- INDXKEY PROC FAR
- ORG 100H
- START: JMP ENTER
- ASCIIZ DB 80 DUP (0)
- FILE_BUFF DB 150 DUP (?)
- CURR_DRIVE DB ?
- CURR_DIR DB '\',63 DUP (?)
- PATH_FLAG DB 0
- DRIVE_FLAG DB 0
- COUNTER DB 1
- BYTES_READ DW ?
- DEFAULT DB '*.NDX',0
- DTA DB 30 DUP (?)
- FILENAME DB 13 DUP (?)
- BAD_DOS DB 'INCORRECT DOS VERSION - MUST BE 2.0 OR GREATER'
- DB 0DH,0AH,'$'
- ERRMSG1 DB 'FILE NOT FOUND',0DH,0AH,'$'
- ERRMSG2 DB 'ACCESS DENIED',0DH,0AH,'$'
- ERRMSG3 DB 'READ ACCESS TO REQUESTED FILE NOT PERMITTED'
- DB 0DH,0AH,'$'
- ERRMSG4 DB 'INVALID FILE HANDLE',0DH,0AH,'$'
- ERRMSG5 DB 'PATH NOT FOUND',0DH,0AH,'$'
- ERRMSG6 DB 'TOO MANY FILES ARE OPEN',0DH,0AH,'$'
- FILEMSG DB 'ENTER FILENAME (<RETURN> FOR *.NDX): ','$'
- CONT_MSG DB 0DH,0AH,'PRESS ANY KEY TO CONTINUE...$'
- ;
- ENTER: PUSH AX
- PUSH BX
- PUSH CX
- PUSH DX
- PUSH SI
- PUSH DI
- MOV AX,CS
- MOV DS,AX
- MOV ES,AX
- XOR AX,AX
- CLC
- CALL CHECK_DOS
- JNC DOS_OK
- MOV DX,OFFSET BAD_DOS
- CALL PRINTMESS
- JMP EXIT
- DOS_OK:
- CALL SET_DTA
- CALL GET_DRIVE
- MOV CURR_DRIVE,AL
- MOV SI,80H
- MOVE_FILENAME:
- MOV DI,OFFSET ASCIIZ
- XOR CX,CX
- MOV CL,[SI]
- CMP CL,0
- JNZ YES_FILE
- MOV DX,OFFSET FILEMSG
- CALL PRINTMESS
- MOV DX,7FH
- MOV BYTE PTR [SI-1],80
- MOV AH,0AH
- INT 21H
- CALL CRLF
- INC DX
- MOV BX,DX
- CMP BYTE PTR [BX],0
- JNE NAMENTRD
- MOV CX,6
- MOV SI,OFFSET DEFAULT
- REP MOVSB
- JMP PROCESS_FILE
- NAMENTRD:
- XOR CX,CX
- MOV CL,[BX]
- INC SI
- PUSH DI
- MOV DI,OFFSET ASCIIZ
- PUSH CX
- REP MOVSB
- POP CX
- POP DI
- PUSH DI
- MOV DI,BX
- INC DI
- CLD
- CLC
- CALL IS_PATH
- POP DI
- JNC MOVE_NAME
- CALL GET_DIR
- OR PATH_FLAG,0FFH
- MOVE_NAME:
- MOV BX,DX
- ADD DL,[BX]
- ADC DH,0
- INC DX
- MOV BX,DX
- MOV BYTE PTR [BX],0
- JMP PROCESS_FILE
- YES_FILE:
- DEC CL
- ADD SI,2
- CLD
- CLC
- PUSH DI
- MOV DI,SI
- CALL IS_PATH
- POP DI
- JNC DO_MOVE
- OR PATH_FLAG,0FFH
- DO_MOVE:
- REP MOVSB
- MOV BYTE PTR [DI],0
- PROCESS_FILE:
- PUSH SI
- MOV SI,OFFSET ASCIIZ + 1
- CMP BYTE PTR [SI],':'
- JNE CHEK_PATH
- DEC SI
- MOV DL,[SI]
- AND DL,0DFH
- SUB DL,'A'
- CALL SET_DRIVE
- OR DRIVE_FLAG,0FFH
- POP SI
- CHEK_PATH:
- TEST PATH_FLAG,0FFH
- JZ GO_AHEAD
- CALL GET_DIR
- PUSH DI
- MOV DI,80H
- XOR CX,CX
- MOV CL,[DI]
- ADD DI,[DI]
- AND DI,0FFH
- STD
- MOV AL,'\'
- REPNE SCASB
- INC DI
- MOV BYTE PTR [DI],0
- CLD
- POP DI
- GO_AHEAD:
- CLC
- MOV AL,0
- CALL FIND_FILE
- JNC FILE_FOUND
- JMP EXIT
- FILE_FOUND:
- MOV DX,81H
- MOV SI,DX
- CMP BYTE PTR [SI],' '
- JNE CHANGE_IT
- INC DX
- CHANGE_IT:
- CALL CHANGE_DIR
- OPEN_IT:
- MOV AL,0
- CALL OPEN_FILE
- JC EXIT
- MOV BX,AX
- PUSH BX
- CLC
- CALL READ_FILE
- POP BX
- JC EXIT
- CLC
- CALL CLOSE_FILE
- JC EXIT
- CALL CRLF
- MOV BX,OFFSET ASCIIZ
- MOV DI,OFFSET ASCIIZ
- MOV CX,SIZE ASCIIZ
- MOV AL,'*'
- REPNE SCASB
- JCXZ FILE_DISP_LOOP
- MOV BX,OFFSET FILENAME
- FILE_DISP_LOOP:
- MOV DL,BYTE PTR [BX]
- MOV AH,2
- INT 21H
- INC BX
- CMP BYTE PTR [BX],00H
- JNZ FILE_DISP_LOOP
- ;
- CALL CRLF
- MOV DL,9
- MOV AH,2
- INT 21H
- MOV SI,OFFSET FILE_BUFF+10
- CMP BYTE PTR [SI],'!'
- JGE PRINTKEY
- MOV SI,OFFSET FILE_BUFF+24
- PRINTKEY:
- MOV DL,[SI]
- CMP DL,20H
- JL NEXT_FILE
- MOV AH,2
- INT 21H
- INC SI
- JMP SHORT PRINTKEY
- NEXT_FILE:
- CALL CRLF
- INC COUNTER
- CMP COUNTER,7
- JLE CONTINUE
- MOV COUNTER,1
- MOV DX,OFFSET CONT_MSG
- MOV AH,9
- INT 21H
- MOV AH,8
- INT 21H
- CONTINUE:
- CALL FIND_NEXT
- JC EXIT
- JMP FILE_FOUND
- EXIT: TEST PATH_FLAG,0FFH
- JZ TEST_DRIVE
- MOV DX,OFFSET CURR_DIR
- CALL CHANGE_DIR
- TEST_DRIVE:
- TEST DRIVE_FLAG,0FFH
- JZ EXIT2
- MOV DL,CURR_DRIVE
- CALL SET_DRIVE
- EXIT2: POP DI
- POP SI
- POP DX
- POP CX
- POP BX
- POP AX
- CALL CRLF
- INT 20H
- INDXKEY ENDP
- ;-------------------------------------------
- SET_DTA PROC NEAR
- PUSH AX
- PUSH DX
- MOV DX,OFFSET DTA
- MOV AH,1AH
- INT 21H
- POP DX
- POP AX
- RET
- SET_DTA ENDP
- ;-------------------------------------------
- CHECK_DOS PROC NEAR
- PUSH AX
- MOV AH,30H
- INT 21H
- CMP AL,2
- POP AX
- RET
- CHECK_DOS ENDP
- ;--------------------------------------------
- FIND_FILE PROC NEAR
- PUSH AX
- PUSH CX
- PUSH DX
- MOV AH,4EH
- XOR CX,CX
- MOV DX,OFFSET ASCIIZ
- INT 21H
- JNC END_FIND
- CMP AL,12H
- JNZ CHECK_PATH2
- MOV DX,OFFSET ERRMSG1
- CALL PRINTMESS
- STC
- JMP END_FIND
- CHECK_PATH2:
- CMP AL,3
- JNZ CHECK_FILES2
- MOV DX,OFFSET ERRMSG5
- CALL PRINTMESS
- STC
- JMP END_FIND
- CHECK_FILES2:
- CMP AL,4
- JNZ ACCESS_ERR2
- MOV DX,OFFSET ERRMSG6
- CALL PRINTMESS
- STC
- JMP END_FIND
- ACCESS_ERR2:
- CMP AL,5
- JNZ BAD_CODE2
- MOV DX,OFFSET ERRMSG2
- CALL PRINTMESS
- STC
- JMP END_FIND
- BAD_CODE2:
- MOV DX,OFFSET ERRMSG3
- CALL PRINTMESS
- STC
- END_FIND:
- POP DX
- POP CX
- POP AX
- RET
- FIND_FILE ENDP
- ;--------------------------------------------
- OPEN_FILE PROC NEAR
- PUSH DX
- MOV AH,3DH
- MOV DX,OFFSET FILENAME
- INT 21H
- JNC LEAVE
- CMP AL,2
- JNZ CHECK_PATH
- MOV DX,OFFSET ERRMSG1
- CALL PRINTMESS
- STC
- JMP LEAVE
- CHECK_PATH:
- CMP AL,3
- JNZ CHECK_FILES
- MOV DX,OFFSET ERRMSG5
- CALL PRINTMESS
- STC
- JMP LEAVE
- CHECK_FILES:
- CMP AL,4
- JNZ ACCESS_ERR
- MOV DX,OFFSET ERRMSG6
- CALL PRINTMESS
- STC
- JMP LEAVE
- ACCESS_ERR:
- CMP AL,5
- JNZ BAD_CODE
- MOV DX,OFFSET ERRMSG2
- CALL PRINTMESS
- STC
- JMP LEAVE
- BAD_CODE:
- MOV DX,OFFSET ERRMSG3
- CALL PRINTMESS
- STC
- LEAVE: POP DX
- RET
- OPEN_FILE ENDP
- ;-----------------------------------------
- READ_FILE PROC NEAR
- PUSH AX
- PUSH CX
- PUSH DX
- MOV CX,SIZE FILE_BUFF
- MOV DX,OFFSET FILE_BUFF
- MOV AH,3FH
- INT 21H
- JNC GOOD_READ
- CMP AL,5
- JNZ BAD_HANDLE
- MOV DX,OFFSET ERRMSG3
- CALL PRINTMESS
- STC
- JMP LEAVE_READ
- BAD_HANDLE:
- MOV DX,OFFSET ERRMSG4
- CALL PRINTMESS
- STC
- JMP LEAVE_READ
- GOOD_READ:
- MOV BYTES_READ,AX
- LEAVE_READ:
- POP DX
- POP CX
- POP AX
- RET
- READ_FILE ENDP
- ;-------------------------------------------
- CLOSE_FILE PROC NEAR
- PUSH AX
- PUSH DX
- MOV AH,3EH
- INT 21H
- JNC LEAVE_CLOSE
- MOV DX,OFFSET ERRMSG4
- CALL PRINTMESS
- STC
- LEAVE_CLOSE:
- POP DX
- POP AX
- RET
- CLOSE_FILE ENDP
- ;-------------------------------------------
- FIND_NEXT PROC NEAR
- PUSH AX
- PUSH DX
- MOV DX,OFFSET DTA
- MOV AH,4FH
- INT 21H
- POP DX
- POP AX
- RET
- FIND_NEXT ENDP
- ;-------------------------------------------
- PRINTMESS PROC NEAR
- PUSH AX
- MOV AH,9
- INT 21H
- POP AX
- RET
- PRINTMESS ENDP
- ;------------------------------------------
- CRLF PROC NEAR
- PUSH AX
- PUSH DX
- MOV DL,0DH
- MOV AH,2
- INT 21H
- MOV DL,0AH
- MOV AH,2
- INT 21H
- POP DX
- POP AX
- RET
- CRLF ENDP
- ;------------------------------------------
- CURSREAD PROC NEAR
- PUSH AX
- PUSH BX
- MOV AH,3
- MOV BH,0
- INT 10H
- POP BX
- POP AX
- RET
- CURSREAD ENDP
- ;------------------------------------------
- IS_PATH PROC NEAR
- PUSH AX
- PUSH CX
- PUSH DI
- MOV AL,'\'
- REPNE SCASB
- JCXZ LEAVE_IS_PATH
- STC
- LEAVE_IS_PATH:
- POP DI
- POP CX
- POP AX
- RET
- IS_PATH ENDP
- ;-------------------------------------------
- GET_DRIVE PROC NEAR
- MOV AH,19H
- INT 21H
- RET
- GET_DRIVE ENDP
- ;-------------------------------------------
- GET_DIR PROC NEAR
- PUSH AX
- PUSH SI
- PUSH DX
- MOV AH,47H
- MOV SI,OFFSET CURR_DIR+1
- MOV DL,0
- INT 21H
- POP DX
- POP SI
- POP AX
- RET
- GET_DIR ENDP
- ;-------------------------------------------
- SET_DRIVE PROC NEAR
- MOV AH,0EH
- INT 21H
- RET
- SET_DRIVE ENDP
- ;-------------------------------------------
- CHANGE_DIR PROC NEAR
- PUSH AX
- MOV AH,3BH
- INT 21H
- POP AX
- RET
- CHANGE_DIR ENDP
- ;-------------------------------------------
- CODESEG ENDS
- ;********************************************
- END START